#include <iostream>
#include <cstring>
#include <regex>
#include <unordered_map>

class HttpRequest
{

public:
    std::string _method;                                   // 请求方法
    std::string _path;                                     // 资源路径
    std::string _version;                                  // 版本号
    std::string _body;                                     // 正文
    std::smatch _matches;                                  // 资源路径的正则提取数据
    std::unordered_map<std::string, std::string> _headers; // 头部字段
    std::unordered_map<std::string, std::string> _params;  // 查询字段

public:
    HttpRequest() : _version("HTTP/1.1") {}

    void RSet() // 设置为原始状态
    {
        _method.clear();
        _path.clear();
        _version = "HTTP/1.1";
        _body.clear();
        std::smatch match;
        _matches.swap(match);
        _headers.clear();
        _params.clear();
    }

    void SetHeader(const std::string &key, const std::string &val)
    {
        _headers.insert(std::make_pair(key, val));
    }

    // 是否存在指定的头部字段
    bool HasHeader(const std::string &key) const
    {
        auto it = _headers.find(key);
        if (it == _headers.end())
        {
            return false;
        }
        return true;
    }

    std::string GetHeader(const std::string &key) const
    {
        auto it = _headers.find(key);
        if (it == _headers.end())
        {
            return "";
        }
        return it->second;
    }

    void SetParam(const std::string &key, const std::string &val)
    {
        _params.insert(std::make_pair(key, val));
    }

    // 判断是否有某个指定的查询支付串
    bool HasParam(const std::string &key) const
    {
        auto it = _params.find(key);
        if (it == _headers.end())
        {
            return false;
        }
        return true;
    }

    // 获取指定的查询字符串

    std::string GetParam(const std::string &key) const
    {
        auto it = _params.find(key);
        if (it == _headers.end())
        {
            return "";
        }
        return it->second;
    }


    size_t ContentLength() const
    {
        bool ret=HasHeader("Content-Length");
        if(ret==false)
        {
            return 0;
        }
        
        std::string clen=GetHeader("Content-Length");

        return std::stol(clen);
    }

    //判断是否是短连接
    //没有Connection字段或者有Connection字段，但值是close，是短链接
    bool Close() const
    {
        if(HasHeader("Connection")==true&&GetHeader("Connection")=="keep-alive")
        {
            return false;
        }
        return true;
    }


};